"""
CPM/Utils: Набор общих вспомогательных функций
Author: Milinuri Nirvalen
Ver: 2.0
"""

from screen import Logger

import os
from icecream import ic

log = Logger('Utils')



"""
Параметры пакета
----------------
        name: Имя пакета
        desc: Краткое описание пакета
    Full_desc: Полное описание пакета
          ver: Строковая версияя пакета
        build: Номер сборки пакета
         type: Тип пакета
       groups: Принадлежность пакета к грурппам
      authors: Авторы пакета
       requre: Зависимости пакета
         used: Ex: Кому трубуется пакет
        files: Ex: Файлы пакета
     multiple: Ex: было ли описано несколько пакето в packages.toml
          url: Ссылка для загрузки файлов
"""

package_base = {
    "name": "package", "desc": "no desc", "full_desc": "no full desc",
    "ver": "1.0", "build": 1, "type": "package", "groups":[],
    "authors": [], "require": [], "used":[], "files": {}, "path": "",
    "multiple": False, "url": None
}


def check_params(data, model):
    """Дополняет отцуцтвующие ключи словаря по образцу.
    :param data: Cловарь для проверки
    :param model: Образец, по которому делается проверка

    :return: Словарь с дополненными ключами"""

    for k, v in model.items():
        if k not in data or data[k] is None:
            data[k] = v

    return data

def print_dict(data):
    """Выводит содержимое словаря.
    :param data: Словарь для отображения."""
    
    s = max(map(len, data.keys()))

    for k, v in data.items():
        if isinstance(v, list):
            v = ', '.join(map(str, v))

        if isinstance(v, dict):
            res = ""
            for nk, nv in v.items():
                res += f'\n{nk}: {nv}'
            v = res

        if isinstance(v, str):
            v = v.replace('\n', '\n'+' '*s+' | ')

        print(f'\033[36m{k}\033[0m{" "*(s-len(k))}: {v}')

def path_iterator(pathes):
    """Возвращает по одному пути из списка, пропуская скрытые.

    :param places: Список возвращаемых путей
    :return: Следующий путь из списка"""
    
    for path in pathes:
        last_folder = path.split('/')[-1]

        # Пропускаем скрытые и начинающиемя с _.
        if len(pathes) > 1 and last_folder[0] in ['.', '_']:
            continue

        # Пропускаем отцуцтвующие пути
        if not os.path.exists(path):
            log.warn(f'Не нашла {path}/', 'PI')
            continue

        yield path

def fcheck(path, create=False):
    """Проверяет существование директории.
    :param path: Путь к директории
    :param create: Создать ли директории при её отцуцтвии"""

    if os.path.exists(path):
        return True

    if create:
        os.makedirs(path)
        log.complite(f'Создаю {path}/', 'FC')
    else:
        log.warn(f'Не смогла найти {path}/', 'FC')

def ask_user():
    """Спрашивает у пользователя подтверждение операции."""

    text = "\033[90mВсё правильно (\033[95mY\033[90m/\033[91mN\033[90m)\033[0m? "

    i = input(text) or ''
    if i and i.lower()[0] in ['y', 'д']:
        return True

    return False
